Laravel8 「Blade Components」ってヤツとview周り: ひとまずハローワールド
「Blade Components」ってヤツを使ってbodyタグと他を分けて「ハローワールド」を表示させてみる
作成日:2022-12-22, 更新日:2023-07-03
基本
▼私の環境
WIN+Docker+Ubuntuでlaravelを使うための作業メモ
やりたいコト
- HTMLのヘッダ・フッタ、他の共通部を雛形としてどっかに置きたい
「Blade Components」を使う・使わない、どちらでも対応可能
→今回は「Blade Components」を使う方針でいく
ざっくりした手順
artisanコマンドを使うっぽい(※使わなくともいけそうな気はする)
→いろんなサイトを見ると使うのが基本っぽい。それにしてもいつもLaravelの公式ドキュメントが検索に出てこない…
→後で気づいたけど「https://readouble.com/」ってのが公式らしい。ドメインにLaravelってつかないんだね
▼手順
- artisanコマンドで「ClassベースComponents」ってヤツを作成
- ビューを修正
artisanコマンド
$ ./vendor/bin/sail php artisan make:component 〇〇〇
▼作られるファイル
- app/View/Components/〇〇〇.php
- resources/views/components/〇〇〇.blade.php
お試し作成とエラーと対応
▼ubuntuで「artisan」のあるとこまでカレントを移してから実行
$ ./vendor/bin/sail php artisan make:component HelloWorld
▼成功したら作成されるファイルたち
- app/View/Components/HelloWorld.php
- resources/views/components/hello-world.blade.php
▼ubuntuお決まりなのか知らないけどいつも通りの権限周りだったり…そんなエラー
file_put_contents(/var/www/html/app/View/Components/HelloWorld.php): Failed to open stream: No such file or directory
▼ちなみに予めフォルダや権限付与せずに「artisanコマンド実行・エラー対応」を繰り返すと言われるエラー
Component already exists.
→途中で作られたファイルを探して削除
▼何も考えずに「artisanコマンド実行」→「エラー対応」→「artisanコマンド実行」と続けると下記のような感じ…かなり面倒
- artisanコマンド実行
- 「app/View/Components」が無いとエラー
- 「app/View/Components」を作成
- artisanコマンド実行
- 「app/View/Components」にアクセス権限が無いとエラー
- 「app/View/Components」を777に変更
- artisanコマンド実行
- 「resources/views/components」が無いとエラー
- 「resources/views/components」を作成
- 「resources/views/components」を777に変更
- artisanコマンド実行
- 「Component already exists.」とエラー
- 「app/View/Components/HelloWorld.php」を削除
- artisanコマンド実行
ハローワールドを表示させるまで
構成はひとまずこんな感じ
- HTMLのbodyタグ以外 - 雛形になる部分
- HTMLのbodyタグの中身 - 各コンテンツ:ハローワールドを表示させる場所
→「Blade Components」で作成するのは「ハローワールド」じゃなく雛形のほう…
HTMLのbodyタグ以外 - 雛形になる部分
artisanコマンド実行(※コンポーネント作成)
後で使いまわすこと考えて「CommonLayout」にしておく
$ ./vendor/bin/sail php artisan make:component CommonLayout
▼作られたファイル
- app/View/Components/CommonLayout.php
- resources/views/components/common-layout.blade.php
雛形作成
▼resources/views/components/common-layout.blade.php
<html> <title>テスト</title> <body> {{ $slot }} </body> </html>
→「<title>テスト</title>」はひとまず決め打ちにしておく
→「{{ $slot }}」が「ハローワールド」に置き換わる予定
HTMLのbodyタグの中身 - 各コンテンツ:ハローワールドを表示させる場所
artisanコマンド実行(※コントローラー作成)
$ ./vendor/bin/sail php artisan make:controller HelloWorldController
▼作られたファイル
- app/Http/Controllers/HelloWorldController.php
コントローラーに記載
▼「app/Http/Controllers/HelloWorldController.php」に追加
public function index() { $viewData = array( 'message' => 'ハローワールド', ); return view('HelloWorld', $viewData); }
→コレで「resources/views/HelloWorld.php」が呼び出されるハズ
ビューの作成
「resources/views/HelloWorld.php」の空ファイルを作成(※ビューの作成もartisanコマンドがあるのかな?)
▼「resources/views/HelloWorld.php」の中身
<x-common-layout> {{ $message }} </x-common-layout>
→「x-common-layout」が「resources/views/components/common-layout.blade.php」を使うってコトになる
→「{{ $message }}」はコントローラーでセットした「$viewData['message']」の出力
ルーティング設定
▼「routes/web.php」に追加
Route::get('/helloworld', [Controllers\HelloWorldController::class, 'index']);
ブラウザで確認
ブラウザで「http://localhost/helloworld」にアクセス
→「ハローワールド」が表示され、ページタイトルが「テスト」になっているはず